#include <iostream>

#include <string>
#include <unordered_map>
#include <set>
#include <vector>
#include <sw/redis++/redis++.h>
#include <chrono>
#include <thread>

#include "util.hpp"

using std::cout;
using std::cin;
using std::string;
using std::endl;
using std::unordered_map;
using std::vector;
using std::set;

using sw::redis::Redis;
using sw::redis::StringView;

using namespace std::chrono_literals;

void Hset(Redis& redis) {
    redis.flushall();

    // 方法 1: 就是直接设置 key  field  value
    redis.hset("key", "field", "value");
    // 方法 2: pair<field, value>
    redis.hset("key", std::make_pair("a", "A"));
    // 方法 3: 列表初始化
    redis.hset("key", {
        std::make_pair("b", "B"),
        std::make_pair("c", "C")
    });
    // 方法 4: 基于容器
    vector<std::pair<string, string>> fields = {
        std::make_pair("e", "E"),
        std::make_pair("f", "F")
    };
    redis.hset("key", fields.begin(), fields.end());

    // 获取这些键值对
    auto result = redis.hget("key", "e");
    if (result) {
        cout << "value = " << result.value() << endl;
    }
}

void Hexists(Redis& redis) {
    redis.flushall();

    redis.hset("key", {
        std::make_pair("b", "B"),
        std::make_pair("c", "C"),
        std::make_pair("d", "D"),
        std::make_pair("f", "F")
    });

    bool result = redis.hexists("key", "b");
}

void Hdel(Redis& redis) {
    redis.flushall();

    redis.hset("key", {
        std::make_pair("b", "B"),
        std::make_pair("c", "C"),
        std::make_pair("d", "D"),
        std::make_pair("f", "F")
    });

    redis.hdel("key", {"b", "c"});

    auto len = redis.hlen("key");
    cout << "长度 = " << len << endl;
}

void HkeysAndHvals(Redis& redis) {
    redis.flushall();

    redis.hset("key", {
        std::make_pair("b", "B"),
        std::make_pair("c", "C"),
        std::make_pair("d", "D"),
        std::make_pair("f", "F")
    });

    vector<string> fields;
    auto it = std::back_inserter(fields);
    redis.hkeys("key", it);

    Print(fields);

    vector<string> values;
    it = std::back_inserter(values);
    redis.hvals("key", it);
    Print(values);
}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    Hset(redis);

    Hdel(redis);

    HkeysAndHvals(redis);
    return 0;
}